package com.magupe.netty.im.server.handler;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

/**
 * ChannelInboundHandlerAdapter类的消息传递
 * 
 * @author m1873
 * @since 2020-06-07
 */
public class HelloServerHandlerAdapter extends ChannelInboundHandlerAdapter{

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf byteBuf = (ByteBuf) msg;
        byte[] reg = new byte[byteBuf.readableBytes()];
        byteBuf.readBytes(reg);
        String body = new String(reg, "UTF-8");
        // String body = byteBuf.toString(Charset.forName("utf-8")));
        System.out.println(body);
 
        // 回复消息
        String respMsg = "我是服务端，消息接受成功！";
        ByteBuf buffer = Unpooled.copiedBuffer(respMsg.getBytes());
        // byte[] bytes = "我是服务端，消息接受成功！".getBytes(Charset.forName("utf-8"));
        // ByteBuf buffer = ctx.alloc().buffer();
        // buffer.writeBytes(bytes);
        
        ctx.write(buffer);
	}
	
	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		 /**flush：将消息发送队列中的消息写入到 SocketChannel 中发送给对方，为了频繁的唤醒 Selector 进行消息发送
         * Netty 的 write 方法并不直接将消息写如 SocketChannel 中，调用 write 只是把待发送的消息放到发送缓存数组中，再通过调用 flush
         * 方法，将发送缓冲区的消息全部写入到 SocketChannel 中
         * */
        ctx.flush();
	}
	
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		/**当发生异常时，关闭 ChannelHandlerContext，释放和它相关联的句柄等资源 */
        ctx.close();
	}
	
}
